package config

import (
	"database/sql"
	"fmt"
	"github.com/pkg/errors"
)

type UdsDB struct {
	GeneralDB `yaml:",inline" mapstructure:",squash"`
}

func (m *UdsDB) Dsn() (string, error) {
	if m.Username == "" ||
		m.Password == "" ||
		m.Ip == "" ||
		m.Port == "" ||
		m.Dbname == "" ||
		m.DbType == "" {
		panic("yaml uds-db 配置数据不完整")
		return "", errors.Errorf("yaml uds-db 配置数据不完整")
	}

	switch m.DbType {
	case "mysql":
		dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?%s", m.Username, m.Password, m.Ip, m.Port, m.Dbname, m.Config)
		return dsn, nil
	case "pgsql":
		dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s %s", m.Ip, m.Username, m.Password, m.Dbname, m.Port, m.Config)
		return dsn, nil
	default:
		panic("yaml uds-db数据库类型不支持")
		return "", errors.Errorf("yaml uds-db数据库类型不支持")
	}
}

func (m *UdsDB) SqlDB() (*sql.DB, error) {
	var db *sql.DB
	var err error
	dsn, err := m.Dsn()
	if err != nil {
		return nil, errors.Errorf("udsDB dsn 获取失败:%v", err)
	}

	switch m.DbType {
	case "mysql":
		db, err = sql.Open("mysql", dsn)
	case "pgsql":
		db, err = sql.Open("postgres", dsn)
	default:
		db = nil
		err = errors.Errorf("数据库类型不支持或是yaml uds-db数据配置不完整")
	}
	if err != nil {
		return nil, errors.Errorf("udsDB sqlDB获取失败:%v", err)
	}

	if err = db.Ping(); err != nil {
		return nil, errors.Errorf("udsDB数据库连接测试失败:%v", err)
	}

	return db, err
}

func (m *UdsDB) GetLogMode() string {
	return m.LogMode
}
